package com.ecommerce.health;

import lombok.RequiredArgsConstructor;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.cluster.ClusterHealth;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.HashMap;
import java.util.Map;

/**
 * Elasticsearch健康检查控制器
 * 提供ES集群健康状态检查接口
 */
// EsHealthController.java
@RestController
@RequestMapping("/api/health")
@RequiredArgsConstructor
public class EsHealthController {

    /**
     * Elasticsearch操作模板
     * 用于执行ES相关操作
     */
    private final ElasticsearchOperations elasticsearchOperations;

    /**
     * 检查Elasticsearch集群健康状态
     * @return 包含集群健康信息的响应实体
     *         成功时返回200状态码和集群信息
     *         失败时返回503状态码和错误信息
     */
    @GetMapping("/es")
    public ResponseEntity<Map<String, Object>> checkEsHealth() {
        // 创建返回结果Map
        Map<String, Object> result = new HashMap<>();

        try {
            // 获取ES集群健康状态
            ClusterHealth health = elasticsearchOperations.cluster().health();

            // 组装健康检查结果
            //result.put("status", "UP");

            // 添加集群名称到结果
            result.put("clusterName", health.getClusterName());

            // 添加集群状态到结果
            result.put("status", health.getStatus());

            // 添加节点数量到结果
            result.put("numberOfNodes", health.getNumberOfNodes());

            // 添加是否超时标志到结果
            result.put("timedOut", health.isTimedOut());

            // 返回成功响应
            return ResponseEntity.ok(result);
        } catch (Exception e) {
            // 捕获异常并记录错误状态
            result.put("status", "DOWN");

            // 添加错误信息到结果
            result.put("error", e.getMessage());

            // 返回服务不可用响应
            return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(result);
        }
    }
}